package com.rose.redis._data_structure.zset;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.StringRedisTemplate;

/**
 * Redis的Zset
 * 一：类似于Java中的LinkedHashSet，有序的set集合。
 * <p>
 * 二：使用场景
 * 1：zset可以用做排行榜，但是和list不同的是zset它能够实现动态的排序，例如：可以用来存储粉丝列表，value值是粉丝的用户ID，score是关注时间，我们可以对粉丝列表按关注时间进行排序。
 * 2：zset还可以用来存储学生的成绩，value值是学生的ID, score是他的考试成绩。我们对成绩按分数进行排序就可以得到他的名次。e.g：stringRedisTemplate.opsForZSet().rangeByScore
 * <p>
 * 三：常用命令
 * 1：zadd [key] [score] [value]：向指定key的集合中增加元素。
 * 2：zrange [key] [start_index] [end_index]：获取下标范围内的元素列表，按score 排序输出。
 * 3：zrevrange [key] [start_index] [end_index]：获取范围内的元素列表 ，按score排序 逆序输出。
 * 4：zcard [key]：获取集合列表的元素个数。
 * 5：zrank [key] [value]：获取元素再集合中的排名。
 * 6：zrangebyscore [key] [score1] [score2]：输出score范围内的元素列表。
 * 7：zrem [key] [value]：删除元素。
 * 8：zscore [key] [value]：获取元素的score。
 *
 * @author: zhu.chen
 * @date: 2021/1/5
 * @version: v1.0.0
 */
//@Component
public class TestZsetCommandLineRunner implements CommandLineRunner {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void run(String... args) throws Exception {
        stringRedisTemplate.opsForZSet().add("name", "zhangsan", 1);
        stringRedisTemplate.opsForZSet().add("name", "xiaoming", 3);
        stringRedisTemplate.opsForZSet().add("name", "xiaohong", 2);
        System.out.println(stringRedisTemplate.opsForZSet().rangeByScore("name", 1, 3).toString());
        System.out.println(stringRedisTemplate.opsForZSet().range("name", 1, 3).toString());
        // 下标从0开始，跟集合/数组的下标一样
        System.out.println(stringRedisTemplate.opsForZSet().rank("name", "xiaoming"));
    }

}
